import { loginUser, getProfile, registerUser } from '@/api/sys.ts'
import md5 from 'md5'
import { message } from '@/libs/message'
import { LOGIN_TYPE_OAUTH_NO_REGISTER_CODE } from '@/constants'
import { parse, stringify } from 'zipson'
import { defineStore } from 'pinia'

export const useUserStore = defineStore('userStore', {
  state: () => ({
    // 登录之后的 token
    token: '',
    // 获取用户信息
    userInfo: {} as any,
  }),
  getters: {
    /**
     * token
     */
    token: (state) => state.token,
    /**
     * 获取用户信息
     */
    userInfo: (state) => state.userInfo,
  },
  actions: {
    /**
     * 保存 token
     */
    setToken(newToken: string) {
      this.token = newToken
    },
    /**
     * 保存用户信息
     */
    setUserInfo(newInfo: any) {
      this.userInfo = newInfo
    },
    /**
     * 注册
     */
    async register(payload: any) {
      const { password } = payload
      // 注册
      return await registerUser({
        ...payload,
        password: password ? md5(password) : '',
      })
    },
    /**
     * 登录
     */
    async login(payload: any) {
      const { password } = payload
      const data = await loginUser({
        ...payload,
        password: password ? md5(password) : '',
      })
      // QQ 扫码登录，用户未注册
      if (data.code === LOGIN_TYPE_OAUTH_NO_REGISTER_CODE) {
        return data.code
      }
      this.setToken(data.token)
      this.profile()
    },
    /**
     * 获取用户信息
     */
    async profile() {
      const data = await getProfile()
      this.setUserInfo(data)
      // 欢迎
      message(
        'success',
        `欢迎您 ${
          data.vipLevel ? '尊贵的 VIP' + data.vipLevel + ' 用户 ' + data.nickname : data.nickname
        } `,
        6000,
      )
    },
    /**
     * 退出登录
     */
    logout() {
      this.setToken('')
      this.setUserInfo({})
      // 退出登录之后，重新刷新下页面，因为对于前台项目而言，用户是否登录（是否为 VIP）看到的数据可能不同
      location.reload()
    },
  },
  persist: {
    key: 'userStore',
    storage: localStorage,
    serializer: {
      deserialize: parse,
      serialize: stringify,
    },
  },
})
